package edu.szcu.vitaguard.service;

import edu.szcu.vitaguard.entity.Prescription;
import edu.szcu.vitaguard.entity.PrescriptionItem;
import edu.szcu.vitaguard.vo.PageResult;
import edu.szcu.vitaguard.vo.PrescriptionQuery;

import java.util.List;

/**
 * 处方服务接口
 */
public interface PrescriptionService {

    /**
     * 添加处方
     * @param prescription 处方信息
     * @return 添加成功返回处方ID，失败返回null
     */
    Integer addPrescription(Prescription prescription);

    /**
     * 更新处方
     * @param prescription 处方信息
     * @return 更新成功返回true，失败返回false
     */
    boolean updatePrescription(Prescription prescription);

    /**
     * 删除处方
     * @param prescriptionId 处方ID
     * @return 删除成功返回true，失败返回false
     */
    boolean deletePrescription(Integer prescriptionId);

    /**
     * 根据ID查询处方
     * @param prescriptionId 处方ID
     * @return 处方信息
     */
    Prescription getPrescriptionById(Integer prescriptionId);

    /**
     * 分页查询处方列表
     * @param query 查询条件
     * @return 处方列表
     */
    PageResult<Prescription> listPrescriptions(PrescriptionQuery query);

    /**
     * 根据患者ID查询处方列表
     * @param patientId 患者ID
     * @return 处方列表
     */
    List<Prescription> listPrescriptionsByPatientId(Integer patientId);

    /**
     * 根据医生ID查询处方列表
     * @param doctorId 医生ID
     * @return 处方列表
     */
    List<Prescription> listPrescriptionsByDoctorId(Integer doctorId);

    /**
     * 根据就诊记录ID查询处方
     * @param visitId 就诊记录ID
     * @return 处方信息
     */
    Prescription getPrescriptionByVisitId(Integer visitId);

    /**
     * 添加处方项
     * @param prescriptionItem 处方项信息
     * @return 添加成功返回处方项ID，失败返回null
     */
    Integer addPrescriptionItem(PrescriptionItem prescriptionItem);

    /**
     * 更新处方项
     * @param prescriptionItem 处方项信息
     * @return 更新成功返回true，失败返回false
     */
    boolean updatePrescriptionItem(PrescriptionItem prescriptionItem);

    /**
     * 删除处方项
     * @param itemId 处方项ID
     * @return 删除成功返回true，失败返回false
     */
    boolean deletePrescriptionItem(Integer itemId);

    /**
     * 根据处方ID查询处方项列表
     * @param prescriptionId 处方ID
     * @return 处方项列表
     */
    List<PrescriptionItem> listPrescriptionItemsByPrescriptionId(Integer prescriptionId);
    
    /**
     * 发药
     * @param prescriptionId 处方ID
     * @return 发药成功返回true，失败返回false
     */
    boolean dispense(Integer prescriptionId);
    
    /**
     * 退药
     * @param prescriptionId 处方ID
     * @return 退药成功返回true，失败返回false
     */
    boolean returnMedicine(Integer prescriptionId);
}
